#ifndef GW_RS485_H
#define GW_RS485_H


#include "stm32f0xx_hal.h"
#include "cmsis_os.h"
#include "GWType.h"


#define RS485_CMD_SLEEP    0x01
#define RS485_CMD_WEAKUP   0x02

#define USART1_DE_Pin GPIO_PIN_11
#define USART1_DE_GPIO_Port GPIOA
#define UART4_DE_Pin GPIO_PIN_15
#define UART4_DE_GPIO_Port GPIOA

#define HMIRECV HAL_GPIO_WritePin(USART1_DE_GPIO_Port,USART1_DE_Pin,GPIO_PIN_RESET)
#define HMISEND HAL_GPIO_WritePin(USART1_DE_GPIO_Port,USART1_DE_Pin,GPIO_PIN_SET)
#define PC485RECV HAL_GPIO_WritePin(UART4_DE_GPIO_Port,UART4_DE_Pin,GPIO_PIN_RESET)
#define PC485SEND HAL_GPIO_WritePin(UART4_DE_GPIO_Port,UART4_DE_Pin,GPIO_PIN_SET)

class GW_RS485
{
private:

   int baud;
   int length;
   osSemaphoreId *recvSemId;
   u8  recvITbuf; 
   int recvedlen;

public:
   static const int MAXBUF=100;
   GW_RS485(UART_HandleTypeDef *huart,TIM_HandleTypeDef *htim,DMA_HandleTypeDef *hdma_usart1_rx,osSemaphoreId *recvid);
   GW_RS485();
   void set485Baud(int baud);
   //void set485WordLength(USART_WordLength_TypeDef USART_WordLength);
   void config(UART_HandleTypeDef *huart, TIM_HandleTypeDef *htim,
				   DMA_HandleTypeDef *hdma_usart1_rx,
				   osSemaphoreId *recvid);
   void init();
   void write(u8 *buf, int length);
   void read(u8 *buf, int length);
// void ioctl(int cmd,...);
   void timeout();
   void beginRecv();
   void recvStart();
   void enableIT();
   int  recvCount();
   void clear();
   int load();
   ~GW_RS485();
   u8  recvbuf[MAXBUF];
   u8  sendbuf[MAXBUF];
   bool  isWaiting;
   UART_HandleTypeDef *uart;
   TIM_HandleTypeDef *tim;
   DMA_HandleTypeDef *dma_rx; 

};

#endif

